package com.wooming.myserver.controller;

import com.wooming.myserver.dto.JwtDTO;
import com.wooming.myserver.dto.TurnDTO;
import com.wooming.myserver.service.inter.GameInitService;
import com.wooming.myserver.service.inter.GameRunningService;
import com.wooming.myserver.service.inter.UserService;
import com.wooming.myserver.util.ApiObserver;
import com.wooming.myserver.util.Result;
import com.wooming.myserver.vo.StartVO;
import com.wooming.myserver.vo.TurnVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 游戏请求控制器
 *
 * @author Wooming 2025/05/24
 */
@RestController
public class GameController {
    // 依赖项
    private final UserService userService;
    private final GameInitService gameInitService;
    private final GameRunningService gameRunningService;

    // 依赖注入
    @Autowired
    public GameController(
            UserService userService,
            GameInitService gameInitService,
            GameRunningService gameRunningService
    ) {
        this.userService = userService;
        this.gameInitService = gameInitService;
        this.gameRunningService = gameRunningService;
    }

    /**
     * 开始游戏
     *
     * @return Result<?> 返回数据为游戏基本数据
     */
    @GetMapping("/api/game/start")
    public Result<?> start() {
        // 监控API调用
        Result<?> result = ApiObserver.observe("开始游戏");
        if (result.getCode() != 200) return result;

        // 获取认证信息
        JwtDTO jwtDTO = (JwtDTO) result.getData();

        // 获取用户当前游戏数据
        StartVO data = gameInitService.start(jwtDTO.getSub());

        return Result.success(data);
    }

    /**
     * 获取升级所需的资源消耗
     *
     * @return Result<?> 返回数据为全部模块升级资源消耗
     */
    @GetMapping("/api/game/cost")
    public Result<?> cost() {
        // 监控API调用
        Result<?> result = ApiObserver.observe("获取游戏资源消耗");
        if (result.getCode() != 200) return result;

        // 获取认证信息
        JwtDTO jwtDTO = (JwtDTO) result.getData();

        // 获取全部模块升级所需的资源消耗
        return Result.success(gameInitService.allCost(jwtDTO.getSub()));
    }

    /**
     * 模块升级
     *
     * @param moduleName 模块名称
     * @return Result<?> 返回数据该模块下一级资源消耗
     */
    @PostMapping("/api/game/levelUp")
    public Result<?> levelUp(@RequestParam("moduleName") String moduleName) {
        // 监控API调用
        Result<?> result = ApiObserver.observe("模块升级");
        if (result.getCode() != 200) return result;

        // 获取认证信息
        JwtDTO jwtDTO = (JwtDTO) result.getData();

        // 状态检测
        if (jwtDTO.getStage() == 1 && moduleName.startsWith("Security")) {
            return Result.error(400, "请先达到下一阶段");
        }

        // 模块升级
        boolean success = gameRunningService.moduleLevelUp(jwtDTO.getSub(), moduleName);

        // 返回结果:成功则返回下一级资源消耗,失败则返回错误信息
        return success ? Result.success(
                gameRunningService.nextLevelCost(jwtDTO.getSub(), moduleName)
        ) : Result.error(400, "资源不足");
    }

    /**
     * 阶段升级
     *
     * @return Result<?> 返回情况,成功则返回新jwt,失败则返回错误信息
     */
    @PostMapping("/api/game/stageUp")
    public Result<?> stageUp() {
        // 监控API调用
        Result<?> result = ApiObserver.observe("阶段升级");
        if (result.getCode() != 200) return result;

        // 获取认证信息
        JwtDTO jwtDTO = (JwtDTO) result.getData();

        try {
            if (gameRunningService.stageUp(jwtDTO.getSub())) {
                // 升级成功,返回新jwt
                return Result.success(userService.getJWT(
                        userService.findUser(jwtDTO.getSub())
                ));
            } else {
                // 升级失败,返回错误信息
                return Result.error(400, "资源不足");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return Result.error(500, "服务器错误");
        }
    }

    /**
     * 回合结算
     *
     * @param turnDTO 回合信息
     * @return Result<?> 返回数据为回合结算信息
     */
    @PostMapping("/api/game/turn")
    public Result<?> turn(@RequestBody TurnDTO turnDTO) {
        // 监控API调用
        Result<?> result = ApiObserver.observe("回合结算");
        if (result.getCode() != 200) return result;

        // 获取认证信息
        JwtDTO jwtDTO = (JwtDTO) result.getData();

        // 构建完整的TurnDTO信息
        turnDTO.setUserId(jwtDTO.getSub());
        turnDTO.setStage(jwtDTO.getStage());

        // 回合结算逻辑
        TurnVO turnVO = gameRunningService.turn(turnDTO);

        // 返回结果
        return Result.success(turnVO);
    }
}
